﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CROSLAND.DL.DALCF;
using System.Security.Cryptography;
using CROSLAND.BL.BE;
using DECOR.BL.BE;

namespace CROSLAND.BL.BC
{
    public class ParametroBC
    {
        #region Mejoras Web v2

        public void getDataDDL(ref List<GenericBE> lstAlmacen, ref List<GenericBE> lstAsesores,
            ref List<GenericBE> lstBloEnt, ref List<GenericBE> lstBloFac, ref List<GenericBE> lstCanal,
            ref List<GenericBE> lstCondExp, ref List<GenericBE> lstCondicionPago, ref List<GenericBE> lstGrpCond,
            ref List<GenericBE> lstGrpVend, ref List<GenericBE> lstMotPed, ref List<GenericBE> lstOfVtas,
            ref List<GenericBE> lstOrgVtas, ref List<GenericBE> lstSectores, ref List<GenericBE> lstTipoDoc,
            out DateTime fechaHasta, ref List<GenericBE> lstMotRec, ref List<GenericBE> lstZonaReg,
            ref List<GenericBE> lstGrupoCli, ref List<UbigeoBE> lstUbigeo, ref List<GenericBE> lstCamp, ref List<GenericBE> lstCity,
            ref List<GenericBE> lstColor, ref List<GenericBE> lstDispo, ref List<GenericBE> lstGrpArt, ref List<GenericBE> lstZReg,
            ref List<GenericBE> lstBancoCheque, ref List<GenericBE> ltsBancoDepo, ref List<GenericBE> lstProcesadora,
            ref List<LibrosxvstelBE> lstLibrosxvstel, out decimal pIGV)
        {
            DaoFactory.ParametroDALC.getDataDDL(ref lstAlmacen, ref lstAsesores,
                                                ref lstBloEnt, ref lstBloFac, ref lstCanal, ref lstCondExp,
                                                ref lstCondicionPago, ref lstGrpCond, ref lstGrpVend, ref lstMotPed,
                                                ref lstOfVtas, ref lstOrgVtas, ref lstSectores, ref lstTipoDoc,
                                                out fechaHasta, ref lstMotRec, ref lstZonaReg, ref lstGrupoCli, ref lstUbigeo, ref lstCamp, ref lstCity, ref lstColor,
                                                ref lstDispo, ref lstGrpArt, ref lstZReg,
                                                ref lstBancoCheque, ref ltsBancoDepo, ref lstProcesadora, ref  lstLibrosxvstel, out pIGV);

            //********************************************************************++
            //agregamos un true si el codigo de tipo de documento se crea con referencia
            foreach (GenericBE item in lstTipoDoc)
            {
                item.conReferencia = ParametroBC.Instance.esTipoX(item.Codigo, "CodConRef");
            }
        }

        public void get_Param_PFact(ref List<GenericBE> lstDenom, ref List<GenericBE> lstMoneda,
            ref List<GenericBE> lstMotivoBloq, ref List<GenericBE> lstClaseDoc, ref List<GenericBE> lstRFACT,
            ref List<GenericBE> lstSTATU, ref List<GenericBE> lstTFPLU,ref List<GenericBE> lstCPag)
        {
            DaoFactory.ParametroDALC.get_Param_PFact(ref  lstDenom, ref  lstMoneda,
                                                        ref lstMotivoBloq, ref lstClaseDoc, ref lstRFACT,
                                                        ref  lstSTATU, ref lstTFPLU, ref lstCPag);
        }
        #endregion

        #region Singleton
        private ParametroBC() { }
        private static ParametroBC _instance = null;
        public static ParametroBC Instance
        {
            get { return (_instance == null) ? _instance = new ParametroBC() : _instance; }
        }
        #endregion

        public decimal getIGV
        {
            get { return Math.Round(DaoFactory.ParametroDALC.getIGV(), 2); }
        }

        public int getDecimales
        {
            get { return DaoFactory.ParametroDALC.getDecimales(); }
        }

        public decimal getTipoCambio()
        {
            return decimal.Round(DaoFactory.ParametroDALC.getTipoCambio(), 4);
        }

        public List<GenericBE> getListaZipCode()
        {
            return DaoFactory.ParametroDALC.getListaZipCode();
        }
        public ClienteBE getClienteReniec(string pDNI)
        {
            return DaoFactory.ParametroDALC.getClienteReniec(pDNI);
        }

        public decimal getTipoCambio(DateTime pFecha)
        {
            return decimal.Round(DaoFactory.ParametroDALC.getTipoCambio(pFecha), 4);
        }

        public bool esTipoX(string pCodigo, string pConfigKey)
        {
            return DaoFactory.ParametroDALC.esTipoXY(pCodigo, pConfigKey);
        }


        public string getParamValue(string key)
        {
            return DaoFactory.ParametroDALC.getParamValue(key);
        }

        public static string encryptString(string pPassword)
        {
            MD5 objMd5 = new MD5CryptoServiceProvider();// .Create();
            ASCIIEncoding enc = new ASCIIEncoding();
            byte[] stream = null;
            StringBuilder sb = new StringBuilder();
            stream = objMd5.ComputeHash(enc.GetBytes(pPassword));
            for (int i = 0; i < stream.Length; i++) sb.AppendFormat("{0:x2}", stream[i]);
            return sb.ToString();
        }

        public static string fechaLarga(DateTime pFecha)
        {
            string pDia, pMes;
            switch (pFecha.DayOfWeek)
            {
                case DayOfWeek.Monday: pDia = "Lunes"; break;
                case DayOfWeek.Tuesday: pDia = "Martes"; break;
                case DayOfWeek.Wednesday: pDia = "Miércoles"; break;
                case DayOfWeek.Thursday: pDia = "Jueves"; break;
                case DayOfWeek.Friday: pDia = "Viernes"; break;
                case DayOfWeek.Saturday: pDia = "Sábado"; break;
                case DayOfWeek.Sunday: pDia = "Domingo"; break;
                default: pDia = ""; break;
            }
            switch (pFecha.Month)
            {
                case 1: pMes = "Enero"; break;
                case 2: pMes = "Febrero"; break;
                case 3: pMes = "Marzo"; break;
                case 4: pMes = "Abril"; break;
                case 5: pMes = "Mayo"; break;
                case 6: pMes = "Junio"; break;
                case 7: pMes = "Julio"; break;
                case 8: pMes = "Agosto"; break;
                case 9: pMes = "Septiembre"; break;
                case 10: pMes = "Octubre"; break;
                case 11: pMes = "Noviembre"; break;
                case 12: pMes = "Diciembre"; break;
                default: pMes = ""; break;
            }
            return pDia + ", " + pFecha.Day + " de " + pMes + " de " + pFecha.Year;
        }


        public static bool contraseniaValida(string password)
        {
            int bandera = 0; string cadaux = "";
            int i; bool respuesta = false;
            for (i = 0; i < password.Length; i++)
            {
                bandera = 0;
                if (password[i].Equals('0') || password[i].Equals('1') || password[i].Equals('2') || password[i].Equals('3') || password[i].Equals('4') || password[i].Equals('5') || password[i].Equals('6') || password[i].Equals('7') || password[i].Equals('8') || password[i].Equals('9'))
                {
                    bandera = 1;
                    cadaux = cadaux + password[i];
                }
            }
            if (cadaux.Length.Equals(password.Length) && bandera.Equals(1))
            {
                respuesta = false;
            }
            else if (cadaux.Length < password.Length && bandera.Equals(1))
            {
                respuesta = true;
            }
            else if (bandera.Equals(0))
            {
                respuesta = false;
            }
            return respuesta;
        }

        public List<GenericBE> getDocVtaCot()
        {
            return DaoFactory.ParametroDALC.getDocVtaCot();
        }

        public List<GenericBE> cmbCampana(List<string> lstLote)
        {
            return DaoFactory.ParametroDALC.cmbCampana(lstLote);
        }
        public List<GenericBE> cmbTipodocFac()
        { 
        
            return DaoFactory.ParametroDALC.cmbTipodocFac();
        }

        public List<GenericBE> obtenerParametros(string idTabla)
        {
            //DaoFactory.ConnType = ConnectionType.SQLServer;
            return DaoFactory.ParametroDALC.obtenerTipoDocFactura(idTabla);
        }

        public void getFolioClaseDocumentoPedFac(string numDoc, out string folio, out string claseDocumento, out string tipo)
        {
            DaoFactory.ParametroDALC.getFolioClaseDocumentoPedFac(numDoc, out folio, out claseDocumento, out tipo);
        }

        public void getDatosUbicación(out  List<GenericBE> lstReg, out List<PoblacionBE> lstPob)
        {
            DaoFactory.ParametroDALC.getDatosUbicación(out lstReg, out lstPob);
        }
    }
}
